Indexation des DataFrames
L'index est une collection ordonnée d'étiquettes servant à la sélection et à l'alignement. Il n’a pas besoin d’être une clé primaire de base de données, mais son unicité et son ordre influencent de nombreuses opérations.
Indexeurs principaux
import pandas as pd
df = pd.DataFrame({
"order_id": ["order-42", "order-43"],
"status": ["paid", "pending"],
"customer_id": ["C1", "C2"],
"amount": [120, 80],
}, index=["order-42", "order-43"])
df.loc["order-42", ["status", "amount"]] # étiquettes
df.iloc[0:10, [1, 3]] # positions
df.at["order-42", "status"] # un scalaire par étiquette
df.iat[0, 1] # un scalaire par position
Les tranches d'étiquettes avec .loc incluent généralement les deux bornes lorsqu'elles existent ;
les tranches positionnelles avec .iloc suivent la convention Python semi-ouverte.
Définir et réinitialiser
indexed = df.set_index("order_id", verify_integrity=True)
plain = indexed.reset_index()
Utilisez verify_integrity=True lorsque l'unicité est requise. Triez l'index si les opérations suivantes
dépendent de tranches ordonnées ou d'un comportement de série temporelle.
MultiIndex
Un MultiIndex représente plusieurs niveaux d'étiquettes sur un axe. Il est utile lorsque la sélection
hiérarchique, le remodelage ou les sorties groupées sont au cœur du travail :
sales = pd.DataFrame({
"country": ["Canada", "Canada"], "city": ["Toronto", "Ottawa"], "amount": [10, 20]
})
by_region = sales.set_index(["country", "city"]).sort_index()
toronto = by_region.loc[("Canada", "Toronto")]
canada = by_region.loc["Canada"]
Préférez des colonnes ordinaires si la hiérarchie est temporaire ou si les outils en aval attendent
des tables plates. reset_index restitue les niveaux sous forme de colonnes.
Risque d'alignement
Les affectations et calculs entre objets pandas s'alignent par étiquette. Si la position est voulue, rendez la conversion explicite et vérifiez les longueurs. L'alignement silencieux est une force de pandas, mais aussi une source fréquente de valeurs manquantes inattendues.
Formes de sélection et étiquettes dupliquées
Avec ces étiquettes uniques, df.loc["order-42", ["status", "amount"]] renvoie une Series de longueur 2, df.iloc[0:10, [1, 3]] un DataFrame (2, 2), et les deux accès scalaires renvoient "paid". Utilisez df.loc[["order-42"], ["status", "amount"]] pour conserver une table (1, 2). Une tranche positionnelle s’arrête à la fin ; une position scalaire hors limites lève IndexError.
Un Index est une collection ordonnée, pas un ensemble mathématique : les doublons sont permis. Un accès par une seule étiquette peut donc renvoyer plusieurs lignes. Vérifiez df.index.is_unique et df.columns.is_unique avant de supposer un résultat scalaire. Contrairement à loc, reindex construit les étiquettes demandées et insère des valeurs manquantes pour les absentes ; la recherche stricte par étiquette lève KeyError.